Added utf8 to CP1252 conversion function to util.c
authorparkrrrr <parkrrrr@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 29 Jan 2004 22:04:03 +0000 (22:04 +0000)
committerparkrrrr <parkrrrr@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Thu, 29 Jan 2004 22:04:03 +0000 (22:04 +0000)
gpsbabel/defs.h
gpsbabel/util.c
gpsbabel/waypt.c

index c263c02f36260f1aa50e1ee4b706333546b9b6e5..8df87611532aea0451ee9fb29656ab662fcf9559 100644 (file)
@@ -388,6 +388,7 @@ void rtrim(char *s);
 signed int get_tz_offset(void);
 const char *get_cache_icon(const waypoint *waypointp);
 char * xml_entitize(const char * str);
+char * str_utf8_to_cp1252( const char * str );
 
 /*
  * PalmOS records like fixed-point numbers, which should be rounded
index a89f96a4fc7c0bf80ab1c6fbb406a66e1a124bfa..a8d56244519f5b9578961243f24927da76e392cc 100644 (file)
@@ -638,6 +638,59 @@ dodefault:
        }
 }
 
+char * str_utf8_to_cp1252( const char * str )
+{
+       char *result = xstrdup( str );
+       char *cur = result;
+       
+       while ( cur && *cur ) {
+               if ( *cur & 0x80 ) {
+                       int bytes;
+                       int value;
+                       utf8_to_int( cur, &bytes, &value );
+                       if ( value > 0xff ) {
+                               switch (value) {
+                                       case 0x20AC: value = 0x80; break;
+                                       case 0x201A: value = 0x82; break;
+                                       case 0x0192: value = 0x83; break;
+                                       case 0x201E: value = 0x84; break;
+                                       case 0x2026: value = 0x85; break;
+                                       case 0x2020: value = 0x86; break;
+                                       case 0x2021: value = 0x87; break;
+                                       case 0x02C6: value = 0x88; break;
+                                       case 0x2030: value = 0x89; break;
+                                       case 0x0160: value = 0x8A; break;
+                                       case 0x2039: value = 0x8B; break;
+                                       case 0x0152: value = 0x8C; break;
+                                       case 0x017D: value = 0x8E; break;
+                                       case 0x2018: value = 0x91; break;
+                                       case 0x2019: value = 0x92; break;
+                                       case 0x201C: value = 0x93; break;
+                                       case 0x201D: value = 0x94; break;
+                                       case 0x2022: value = 0x95; break;
+                                       case 0x2013: value = 0x96; break;
+                                       case 0x2014: value = 0x97; break;
+                                       case 0x02DC: value = 0x98; break;
+                                       case 0x2122: value = 0x99; break;
+                                       case 0x0161: value = 0x9A; break;
+                                       case 0x203A: value = 0x9B; break;
+                                       case 0x0153: value = 0x9C; break;
+                                       case 0x017E: value = 0x9E; break;
+                                       case 0x0178: value = 0x9F; break;
+                                       // default is the generic "currency 
+                                       // sign" because question marks 
+                                       // just look stupid.
+                                       default: value = 0xA4; break;
+                               }
+                       }
+                       *cur = (char)value;
+                       strcpy( cur+1, cur+bytes );
+               }
+               cur++;
+       }
+       return result;
+}
+
 char * xml_entitize(const char * str) 
 {
        int elen, ecount, nsecount;
index 32710c729c19d8ac2fd8a57367956d237087fded..17e3cb301de17c92325002092e99d1890d86b239 100644 (file)
@@ -123,16 +123,22 @@ waypt_count(void)
 void
 waypt_disp(const waypoint *wpt)
 {
+       char *tmpdesc = NULL;
        if (wpt->creation_time) {
                printf("%s ", ctime(&wpt->creation_time));
        }
        printposn(wpt->latitude,1);
        printposn(wpt->longitude,0);
+       
+       tmpdesc = str_utf8_to_cp1252( wpt->description);
        printf("%s/%s", 
                global_opts.synthesize_shortnames ? 
-                       mkshort(mkshort_handle, wpt->description) : 
+                       mkshort(mkshort_handle, tmpdesc) : 
                                wpt->shortname, 
-                               wpt->description);
+                               tmpdesc);
+       if ( tmpdesc ) 
+               xfree(tmpdesc);
+
        if (wpt->altitude != unknown_alt)
                printf(" %f", wpt->altitude);
        printf("\n");